import os

def traverse_files(root_dir):
    """递归遍历文件夹下的所有文件路径（生成器版本）

    Args:
        root_dir: 要遍历的根目录路径

    Yields:
        每个文件的完整路径字符串
    """
    for entry in os.scandir(root_dir):
        if entry.is_file():
            yield entry.path
        elif entry.is_dir():
            yield from traverse_files(entry.path)




def filter_and_save_files(src_dir, dest_dir, start_line=None, end_line=None):
    """遍历文件夹中的所有文件，保留指定行范围的内容，并按原文件结构保存到另一个目录中。

    Args:
        src_dir: 源文件夹路径
        dest_dir: 目标文件夹路径
        start_line: 保留的起始行号（从1开始），为None时表示从文件开头开始
        end_line: 保留的结束行号，为None时表示到文件末尾结束
    """
    for file_path in traverse_files(src_dir):
        # 计算目标文件的路径
        relative_path = os.path.relpath(file_path, src_dir)
        dest_file_path = os.path.join(dest_dir, relative_path)

        # 创建目标文件的目录结构
        os.makedirs(os.path.dirname(dest_file_path), exist_ok=True)

        # 读取源文件并保留指定行范围的内容
        with open(file_path, 'r', encoding='utf-8') as src_file:
            lines = src_file.readlines()

            # 处理start_line为None的情况
            if start_line is None:
                start_line = 1
            # 处理end_line为None的情况
            if end_line is None:
                end_line = len(lines)

            # 确保start_line和end_line在有效范围内
            start_line = max(1, start_line)  # 至少为1
            end_line = min(len(lines), end_line)  # 最大为文件行数

            filtered_lines = lines[start_line - 1:end_line]

        # 将过滤后的内容写入目标文件
        with open(dest_file_path, 'w', encoding='utf-8') as dest_file:
            dest_file.writelines(filtered_lines)


if __name__ == "__main__":
    src_dir = r"C:\Users\Msi\Desktop\temp\crawler_test\bannerlord_moddocs\https_\moddocs.bannerlord.com"
    dest_dir = r"C:\Users\Msi\Desktop\temp\crawler_test\bannerlord_moddocs_cut"
    start_line = 130
    end_line = None

    filter_and_save_files(src_dir, dest_dir, start_line, end_line)
